package br.ucb.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.ucb.dao.LivroDAO;
import br.ucb.entidade.Livro;

public class LivroDAOImpl extends AbstractEntidadeDAO<Livro> implements LivroDAO{

	@Override
	protected List<Object> doPreparedStatement(Livro entidade,
			StringBuffer query) {
		List<Object> args = new ArrayList<Object>();
		
		if(entidade.getCodigo()!=null){
			query.append(" AND codigoLivro = ?");
			args.add(entidade.getCodigo());
		}		
		if(entidade.getTitulo()!=null && !entidade.getTitulo().trim().isEmpty()){
			query.append(" AND lower(titulo) LIKE '%"+entidade.getTitulo().trim().toLowerCase()+"%'");
		}
		if(entidade.getEditora()!=null && !entidade.getEditora().trim().isEmpty()){
			query.append(" AND lower(editora) LIKE '%"+entidade.getEditora().trim().toLowerCase()+"%'");
		}
		if(entidade.getAno()!=null && !entidade.getAno().trim().isEmpty()){
			query.append(" AND ano = ?");
			args.add(entidade.getAno());
		}
		if(entidade.getGenero()!=null && !entidade.getGenero().isEmpty()){
			query.append(" AND genero = ?");
			args.add(entidade.getGenero());
		}
		if(entidade.getQtdeDisponivel()!=null){
			query.append(" AND qtdeDisponivel = ?");
			args.add(entidade.getQtdeDisponivel());
		}
		if(entidade.getCorredor()!=null){
			query.append(" AND corredor = ?");
			args.add(entidade.getCorredor());
		}
		if(entidade.getEstante()!=null){
			query.append(" AND estante = ?");
			args.add(entidade.getEstante());
		}
		if(entidade.getPrateleira()!=null){
			query.append(" AND prateleira = ?");
			args.add(entidade.getPrateleira());
		}
		
		query.append(";");
		
		return args;
	}

	@Override
	protected List<Object> getInsertValues(Livro entidade, StringBuffer sql) {
		List<Object> args = new ArrayList<Object>();
		
		if(entidade.getCodigo()!=null){
			sql.append("?,");
			args.add(entidade.getCodigo());
		}		
		if(entidade.getTitulo()!=null){
			sql.append("?,");
			args.add(entidade.getTitulo());
		}
		if(entidade.getEditora()!=null){
			sql.append("?,");
			args.add(entidade.getEditora());
		}
		if(entidade.getAno()!=null){
			sql.append("?,");
			args.add(entidade.getAno());
		}
		if(entidade.getGenero()!=null){
			sql.append("?,");
			args.add(entidade.getGenero());
		}
		if(entidade.getQtdeDisponivel()!=null){
			sql.append("?,");
			args.add(entidade.getQtdeDisponivel());
		}
		if(entidade.getCorredor()!=null){
			sql.append("?,");
			args.add(entidade.getCorredor());
		}
		if(entidade.getEstante()!=null){
			sql.append("?,");
			args.add(entidade.getEstante());
		}
		if(entidade.getPrateleira()!=null){
			sql.append("?,");
			args.add(entidade.getPrateleira());
		}
		
		if(sql.charAt(sql.length()-1)==',')
			sql.deleteCharAt(sql.length()-1);
		
		return args;
	}

	@Override
	protected String getTableValues(Livro entidade) {
		StringBuffer query = new StringBuffer();

		if(entidade.getCodigo()!=null){
			query.append("codigoLivro,");
		}		
		if(entidade.getTitulo()!=null){
			query.append("titulo,");
		}
		if(entidade.getEditora()!=null){
			query.append("editora,");
		}
		if(entidade.getAno()!=null){
			query.append("ano,");
		}
		if(entidade.getGenero()!=null){
			query.append("genero,");
		}
		if(entidade.getQtdeDisponivel()!=null){
			query.append("qtdeDisponivel,");
		}
		if(entidade.getCorredor()!=null){
			query.append("corredor,");
		}
		if(entidade.getEstante()!=null){
			query.append("estante,");
		}
		if(entidade.getPrateleira()!=null){
			query.append("prateleira,");
		}
		
		if(query.charAt(query.length()-1)==',')
			query.deleteCharAt(query.length()-1);
		
		return query.toString();
	}
	
	protected List<Livro> retornaListaEntidades(ResultSet resultado) {
		List<Livro> lista = new ArrayList<Livro>();
		try {
			while(resultado.next()){
				lista.add(new Livro(resultado.getInt(1), resultado.getString(2), resultado.getString(3), resultado.getString(4), resultado.getString(5),
						resultado.getString(6), resultado.getString(7), resultado.getString(8), resultado.getInt(9)));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return lista;
	}

	@Override
	protected String doUpdate(Livro entidade, List<Object> args) {
		StringBuffer update = new StringBuffer("update livro set");
		
		if(entidade.getCodigo()!=null){
			update.append(" codigoLivro = ?,");
			args.add(entidade.getCodigo());
		}		
		if(entidade.getTitulo()!=null){
			update.append(" titulo = ?,");
			args.add(entidade.getTitulo());
		}
		if(entidade.getEditora()!=null){
			update.append(" editora = ?,");
			args.add(entidade.getEditora());
		}
		if(entidade.getAno()!=null){
			update.append(" ano = ?,");
			args.add(entidade.getAno());
		}
		if(entidade.getGenero()!=null){
			update.append(" genero = ?,");
			args.add(entidade.getGenero());
		}
		if(entidade.getQtdeDisponivel()!=null){
			update.append(" qtdeDisponivel = ?,");
			args.add(entidade.getQtdeDisponivel());
		}
		if(entidade.getCorredor()!=null){
			update.append(" corredor = ?,");
			args.add(entidade.getCorredor());
		}
		if(entidade.getEstante()!=null){
			update.append(" estante = ?,");
			args.add(entidade.getEstante());
		}
		if(entidade.getPrateleira()!=null){
			update.append(" prateleira = ?,");
			args.add(entidade.getPrateleira());
		}
		if(update.charAt(update.length()-1)==',')
			update.deleteCharAt(update.length()-1);
		
		update.append(" where codigoLivro = ?;");
		args.add(entidade.getCodigo());
		
		return update.toString();
	}

	@Override
	protected void setTable() {
		super.table = "livro";
	}

	@Override
	protected Livro retornaEntidades(ResultSet resultado) {
		Livro livro=null;
		try {
			while(resultado.next()){
				livro = new Livro(resultado.getInt(1), resultado.getString(2), resultado.getString(3), resultado.getString(4), resultado.getString(5), resultado.getString(6), resultado.getString(7), resultado.getString(8), resultado.getInt(9));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return livro;
	}
	
}
